package com.face.getface.service.Impl;

import com.face.getface.config.ConfigReader;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.face.getface.model.Result;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 人脸识别实现类
 *
 * @author juwujie
 * @date 2024-08-06
 */

public class IGetFace implements com.face.getface.service.IGetFace {


    private ConfigReader configReader;

@Override
public Result faceCompare(String compareImg, String comparedImg) {
    // 检查 configReader 是否已经初始化
    if (configReader == null) {
        throw new IllegalStateException("ConfigReader is not initialized.");
    }

    try {
        // 初始化一个 AipFace，该对象用于调用百度的人脸识别服务
        AipFace client = new AipFace(
                configReader.getAppId(),
                configReader.getApiKey(),
                configReader.getSecretKey()
        );

        // image1 为根据 phoneNumber 获取到的用户照片
        String image1 = compareImg;

        // 从前端拍的照片传到后端的 URL 路径，找到 ";base64," 的位置并加 1，以获取 base64 编码图像数据的起始索引
        int startIndex = comparedImg.indexOf(";base64,") + ";base64,".length();

        // 如果没有找到 ";base64,"，抛出异常
        if (startIndex == -1) {
            throw new IllegalArgumentException("Invalid image format: missing base64 data.");
        }

        // 从起始索引开始，提取出 base64 格式的图像数据
        String image2 = comparedImg.substring(startIndex);

        // 创建匹配请求列表
        MatchRequest request1 = new MatchRequest(image1, "URL"); // 数据库中存储的人脸图片为 URL 照片
        MatchRequest request2 = new MatchRequest(image2, "BASE64"); // 传入的图片为 base64 编码
        List<MatchRequest> requests = Arrays.asList(request1, request2);

        // 调用人脸比对接口
        JSONObject response = client.match(requests);

        // 如果存在嵌套的 JSON 对象
        JSONObject resultObj = response.getJSONObject("result");
        double score = resultObj.getDouble("score");

        if (score >= 70) {
            return Result.success();
        } else {
            return Result.error("人脸比对失败");
        }
    } catch (Exception e) {
        // 处理异常情况
        return Result.error("人脸比对过程中发生错误: " + e.getMessage());
    }
}

}